package com.wy.singleton_demo;

/**
 * @author 美女
 * @date 2022/04/27 22:51
 **/
//单例模式—一个进程中有且只有一个对象
//懒汉模式-用到时再对对象初始化
public class LazyModeV3 {
    private volatile static LazyModeV3 instance=null;//不给实例化赋初值，什么时候用到再初始化
    public static LazyModeV3 getInstance(){
        if(instance==null){//只有instance还未初始化时才会走这个分支
                           //但此处无锁保护，由于线程调度很多线程可能会进到这个分支
            synchronized (LazyModeV3.class) {//加锁后才能执行，第一个抢到锁的线程看到的instance==null
                                             //抢到锁进去实例化后，后面的线程看到的instance就不是null了
                                             //保证了instance只会被实例化一次
                if(instance==null) {//二次判空，给加锁的整体保证原子性
                    instance = new LazyModeV3();
                }
            }
        }
        return instance;
    }
    private LazyModeV3(){}
}
